package main

import (
	"encoding/json"
	"sync"

	"7qule.com/sd3/CrossServer/src/common/notityStartCenter"
	_ "public.com/Framework/linuxMgr"
	"public.com/Framework/managecenterMgr"
	"public.com/Framework/signalMgr"
	"public.com/goutil/logUtil"

	_ "7qule.com/sd3/CrossServer/src/bll"
	"7qule.com/sd3/CrossServer/src/bll/world"
	_ "7qule.com/sd3/CrossServer/src/common/dataInterchange"
	"7qule.com/sd3/CrossServer/src/config"
	"7qule.com/sd3/CrossServer/src/server_gs"
	"7qule.com/sd3/CrossServer/src/webServer"
)

var (
	wg sync.WaitGroup
)

func init() {
	// 设置WaitGroup需要等待的数量，只要有一个服务器出现错误都停止服务器
	wg.Add(1)
}

func main() {
	// 启动信号处理程序
	signalMgr.Start()

	// 打印记录当前的功能记录
	logFunConfig()

	// 开启监控服务
	// logMgrConfig := config.GetLogMgrConfig()
	// monitorConfig := config.GetMonitorConfig()
	// monitorNewMgr.SetParam(logMgrConfig.GroupId, logMgrConfig.GroupSecret, logMgrConfig.ProductId, monitorConfig.ServerIP, monitorConfig.ServerName)
	// monitorNewMgr.RegisterMonitorFunc(monitor)

	//初始化mc配置
	initManagecenterConfig()

	//启动游戏世界
	world.StartGameWorld()

	// 启动监听游戏服务器的服务器
	go server_gs.Start(&wg)

	// 通知启动成功
	go notityStartCenter.Notify()

	// 启动Web服务器
	go webServer.Start(&wg)

	//通知启动成功
	// croConStr := config.GetDbConfig().GetGameConfig().ConnectionString
	// monitorNewMgr.Report("cross启动成功", fmt.Sprintf("cross启动成功 time:%s con:%s  ", time.Now(), croConStr))

	// 阻塞等待，以免main线程退出
	wg.Wait()
}

// 记录当前的功能配置
func logFunConfig() {
	funConfig := config.GetFunctionConfigObj()
	result, err := json.Marshal(funConfig)
	if err != nil {
		panic(err)
	}

	logUtil.LogAndPrint("当前功能开关配置信息："+string(result), logUtil.Debug)
}

// 监控心跳
func monitor() error {
	return nil
}

func initManagecenterConfig() {
	// 启动managecentert管理器
	mcConfig := config.GetManageCenterConfig()
	mcDataSwitch := &managecenterMgr.ManageCenterDataSwitch{
		AllDataSwitch:         true,
		PartnerDataSwitch:     true,
		ServerDataSwitch:      true,
		ServerGroupDataSwitch: true,
		WhiteListDataSwitch:   true,
	}
	managecenterMgr.Start(mcConfig.ManageCenterAPIUrl, mcDataSwitch)
}
